##!/usr/bin/env python
# -*- coding: utf-8 -*-
# Filename: ticket.py

##
# Módulos del sistema
from datetime import datetime

##
# Módulos Propios
from database import TicketBD, IntervencionBD, HistorialDeClasificacionBD
from database import HistorialDeEstadoBD, EstadoBD, ObservacionBD
"""
from database import Intervencion as IntervencionBD
from database import HistorialDeClasificacion as HistorialDeClasificacionBD
from database import HistorialDeEstado as HistorialDeEstadoBD
from database import Estado as EstadoBD
"""

from historial_de_estado import HistorialDeEstado, Estado
from historial_de_clasificacion import HistorialDeClasificacion
from intervencion import Intervencion

class Ticket:
    def __init__(self, usuario = None, empleado = None, clasificacion = None,
            descripcion = None, grupo_actual = None, fecha = None):
        """Constructor por defecto.

        Keyword arguments:
        empleado -- empleado solicitante del ticket
        clasificacion -- clasificacion del problema actual
        descripcion -- descripcion del problema
        grupo_actual -- Mesa de Ayuda
        fecha -- de creacion del ticket
        """
        # Instanciamos con lista vacia
        self.numero = 0
        self.historial_de_estado = []
        self.historial_de_clasificacion = []
        self.intervenciones = []
        self.empleado = empleado
        self.usuario_creacion = usuario
        self.usuario_cierre = None
        self.descripcion = descripcion # ??? Why is this there?
        self.fecha_creacion = fecha
        self.fecha_cierre = None
        self.grupo_actual = grupo_actual
        #Estodo inicial del ticket
        estado = EstadoBD.selectBy(nombre='Abierto en Mesa de Ayuda')[0]
        self.agregar_historial_de_estado(estado)
        self.agregar_historial_de_clasificacion(clasificacion)
        self.agregar_intervenciones(descripcion)
        self.ticket_BD = None
        if usuario:
            self.bolcar_base_de_datos()

    def agregar_historial_de_estado(self, estado_inicial):
        """Agrega un historial de estado a la variable de instancia.

        Creará un Estado y luego un Historial de estado, para agregarlo a la
        lista de historiales de estado.

        Keyword arguments:
        estado_inicial -- "Abierto en Mesa de Ayuda"
        """
        self.historial_de_estado.append(HistorialDeEstado(Estado(estado_inicial)))

    def agregar_historial_de_clasificacion(self, clasificacion):
        """Agrega un historial de clasificacion.

        Creará un HistorialDeClasificacion y le asigna 'clasificacion' y luego
        agrega a la lista de historial de clasificacion

        Keyword arguments:
        clasificacion -- Clasificacion del problema. type:
        """
        self.historial_de_clasificacion.append(HistorialDeClasificacion(clasificacion))

    def agregar_intervenciones(self, descripcion):
        self.intervenciones.append(Intervencion(descripcion))

    def bolcar_base_de_datos(self):
        """Es el set de Ticket.

        Keyword arguments:
        None
        """
        # Nuevo ticket: ver fecha de cierre
        ticket = TicketBD(fecha_cierre = self.fecha_creacion,
                fecha_creacion = self.fecha_creacion,
                descripcion = self.descripcion,
                grupo_de_resolucion = self.grupo_actual.grupo_BD.id,
                empleado_solicitante = self.empleado.empleado_BD.id,
                usuario_creacion = self.usuario_creacion.usuario_BD.id,
                usuario_cierre = None)
        self.ticket_BD = ticket
        self.numero = ticket.id
        # Primera intervencion: sin observaciones por el momento
        intervencion = IntervencionBD(fecha = self.fecha_creacion,
                clasificacion = self.historial_de_clasificacion[0].clasificacion.clasificacion_BD.id,
                grupo_de_resolucion = self.grupo_actual.grupo_BD.id,
                ticket_id = ticket.id)
        # Historial de clasificacion
        historial_de_clasificacion = HistorialDeClasificacionBD(
                fecha = self.fecha_creacion,
                clasificacion = self.historial_de_clasificacion[0].clasificacion.clasificacion_BD.id,
                ticket = ticket.id)
        # Historial de estado
        historial_de_estado = HistorialDeEstadoBD(fecha = self.fecha_creacion,
                empleado = self.empleado.empleado_BD.id,
                ticket = ticket.id)
        # Estado:
        self.historial_de_estado[-1].estado.estado_BD.set(
                historial_de_estado = historial_de_estado.id)


    def dar_de_baja(self, usuario, observacion, fecha_cierre):
        """Registra el cierre en la BD.

        Keyword arguments:
        usuario -- el que cierra el ticket
        observacion -- solucion al problema
        fecha_cierre
        #!!! BUG
        """
        historial_de_estado = HistorialDeEstadoBD(fecha = self.fecha_cierre,
                empleado = usuario.empleado_BD.id,
                ticket = self.ticket_BD.id)
        estado = EstadoBD.selectBy(nombre='Cerrado')[0]
        estado.set(historial_de_estado=historial_de_estado.id)
        self.ticket_BD.set(cerrado=True)

    def derivarTicket(self, grupo, fecha_derivacion, obs, usuario):
        """Registra la derivacion en la BD.

        Keyword arguments:
        grupo -- Grupo de resolucion a derivar <type lib.grupo_de_resolucion>
        fecha_derivacion --
        obs --
        usuario --
        """
        estado = EstadoBD.selectBy(nombre='Abierto derivado')[0]
        self.agregar_historial_de_estado(estado)
        self.intervenciones[-1].agregarObservacion(obs)
        self.grupo_actual = grupo
        self.ticket_BD.set(grupo_de_resolucion = grupo.grupo_BD.id)
        # Actualizamos la BD
        historial_de_estado = HistorialDeEstadoBD(fecha = fecha_derivacion,
                empleado = usuario.empleado_BD.id,
                ticket = self.ticket_BD.id)
        estado = EstadoBD(descripcion = 'Mesa de Ayuda no resolvio',
                    nombre = 'Abierto derivado',
                    historial_de_estado = historial_de_estado.id)
        observacion = ObservacionBD(descripcion = obs,
                grupo_de_resolucion = grupo.grupo_BD.id,
                intervencion_id = self.ticket_BD.intervenciones.pop().id,
                usuario_id = usuario.usuario_BD.id,
                fecha = fecha_derivacion)
